Μάθετε πώς να δοκιμάζετε αποτελεσματικά τις εφαρμογές σας FastAPI χρησιμοποιώντας το TestClient. Καλύψτε βέλτιστες πρακτικές, προηγμένες τεχνικές και πραγματικά παραδείγματα για ισχυρά και αξιόπιστα API.
Κατανόηση των Δοκιμών FastAPI: Ένας Ολοκληρωμένος Οδηγός για το TestClient
Το FastAPI έχει αναδειχθεί ως ένα κορυφαίο framework για τη δημιουργία API υψηλής απόδοσης με την Python. Η ταχύτητά του, η ευκολία χρήσης και η αυτόματη επικύρωση δεδομένων το καθιστούν αγαπημένο στους προγραμματιστές παγκοσμίως. Ωστόσο, ένα καλά κατασκευασμένο API είναι τόσο καλό όσο οι δοκιμές του. Η διεξοδική δοκιμή διασφαλίζει ότι το API σας λειτουργεί όπως αναμένεται, παραμένει σταθερό υπό πίεση και μπορεί να αναπτυχθεί με σιγουριά στην παραγωγή. Αυτός ο ολοκληρωμένος οδηγός εστιάζει στη χρήση του TestClient του FastAPI για την αποτελεσματική δοκιμή των τελικών σημείων του API σας.
Γιατί είναι Σημαντικές οι Δοκιμές για τις Εφαρμογές FastAPI;
Η δοκιμή είναι ένα κρίσιμο βήμα στον κύκλο ζωής ανάπτυξης λογισμικού. Σας βοηθάει να:
- Εντοπίσετε σφάλματα έγκαιρα: Εντοπίστε σφάλματα πριν φτάσουν στην παραγωγή, εξοικονομώντας χρόνο και πόρους.
- Διασφαλίσετε την ποιότητα του κώδικα: Προωθήστε καλά δομημένο και συντηρήσιμο κώδικα.
- Αποτρέψετε παλινδρομήσεις: Εγγυηθείτε ότι οι νέες αλλαγές δεν θα σπάσουν την υπάρχουσα λειτουργικότητα.
- Βελτιώσετε την αξιοπιστία του API: Δημιουργήστε εμπιστοσύνη στη σταθερότητα και την απόδοση του API.
- Διευκολύνετε τη συνεργασία: Παρέχετε σαφή τεκμηρίωση της αναμενόμενης συμπεριφοράς για άλλους προγραμματιστές.
Παρουσιάζοντας το TestClient του FastAPI
Το FastAPI παρέχει ένα ενσωματωμένο TestClient που απλοποιεί τη διαδικασία δοκιμής των τελικών σημείων του API σας. Το TestClient λειτουργεί ως ένας ελαφρύς client που μπορεί να στείλει αιτήματα στο API σας χωρίς να ξεκινήσει ένας πλήρως ανεπτυγμένος διακομιστής. Αυτό κάνει τη δοκιμή σημαντικά πιο γρήγορη και πιο βολική.
Βασικά Χαρακτηριστικά του TestClient:
- Προσομοιώνει αιτήματα HTTP: Σας επιτρέπει να στέλνετε αιτήματα GET, POST, PUT, DELETE και άλλα αιτήματα HTTP στο API σας.
- Χειρίζεται τη σειριοποίηση δεδομένων: Σειριοποιεί αυτόματα τα δεδομένα αιτήματος (π.χ. ωφέλιμα φορτία JSON) και αποσειριοποιεί τα δεδομένα απόκρισης.
- Παρέχει μεθόδους assertion: Προσφέρει βολικές μεθόδους για την επαλήθευση του κωδικού κατάστασης, των κεφαλίδων και του περιεχομένου των αποκρίσεων.
- Υποστηρίζει ασύγχρονες δοκιμές: Λειτουργεί απρόσκοπτα με την ασύγχρονη φύση του FastAPI.
- Ενσωματώνεται με frameworks δοκιμών: Ενσωματώνεται εύκολα με δημοφιλή frameworks δοκιμών Python όπως το pytest και το unittest.
Ρύθμιση του Περιβάλλοντος Δοκιμών σας
Πριν ξεκινήσετε τις δοκιμές, πρέπει να ρυθμίσετε το περιβάλλον δοκιμών σας. Αυτό συνήθως περιλαμβάνει την εγκατάσταση των απαραίτητων εξαρτήσεων και τη διαμόρφωση του framework δοκιμών σας.
Εγκατάσταση
Πρώτα, βεβαιωθείτε ότι έχετε εγκατεστημένο το FastAPI και το pytest. Μπορείτε να τα εγκαταστήσετε χρησιμοποιώντας το pip:
pip install fastapi pytest httpx
Το httpx είναι ένας HTTP client που χρησιμοποιεί το FastAPI στο παρασκήνιο. Ενώ το TestClient είναι μέρος του FastAPI, το να έχετε εγκατεστημένο το httpx εξασφαλίζει επίσης ομαλή δοκιμή. Μερικά tutorials αναφέρουν επίσης το requests, ωστόσο, το httpx είναι πιο εναρμονισμένο με την async φύση του FastAPI.
Παράδειγμα Εφαρμογής FastAPI
Ας δημιουργήσουμε μια απλή εφαρμογή FastAPI που μπορούμε να χρησιμοποιήσουμε για δοκιμή:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.get("/")
async def read_root():
return {"message": "Hello World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
@app.post("/items/")
async def create_item(item: Item):
return item
Αποθηκεύστε αυτόν τον κώδικα ως main.py. Αυτή η εφαρμογή ορίζει τρία τελικά σημεία:
/: Ένα απλό τελικό σημείο GET που επιστρέφει ένα μήνυμα "Hello World"./items/{item_id}: Ένα τελικό σημείο GET που επιστρέφει ένα στοιχείο με βάση το ID του./items/: Ένα τελικό σημείο POST που δημιουργεί ένα νέο στοιχείο.
Γράφοντας την Πρώτη σας Δοκιμή
Τώρα που έχετε μια εφαρμογή FastAPI, μπορείτε να ξεκινήσετε να γράφετε δοκιμές χρησιμοποιώντας το TestClient. Δημιουργήστε ένα νέο αρχείο με το όνομα test_main.py στον ίδιο κατάλογο με το main.py.
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
Σε αυτή τη δοκιμή:
- Εισάγουμε το
TestClientκαι την παρουσίαappτου FastAPI. - Δημιουργούμε μια παρουσία του
TestClient, περνώντας τοapp. - Ορίζουμε μια συνάρτηση δοκιμής
test_read_root. - Μέσα στη συνάρτηση δοκιμής, χρησιμοποιούμε το
client.get("/")για να στείλουμε ένα αίτημα GET στο root endpoint. - Δηλώνουμε ότι ο κωδικός κατάστασης απόκρισης είναι 200 (OK).
- Δηλώνουμε ότι το JSON απόκρισης είναι ίσο με
{"message": "Hello World"}.
Εκτελώντας τις Δοκιμές σας με το pytest
Για να εκτελέσετε τις δοκιμές σας, απλώς ανοίξτε ένα τερματικό στον κατάλογο που περιέχει το αρχείο test_main.py και εκτελέστε την ακόλουθη εντολή:
pytest
Το pytest θα ανακαλύψει και θα εκτελέσει αυτόματα όλες τις δοκιμές στο έργο σας. Θα πρέπει να δείτε έξοδο παρόμοια με αυτή:
============================= test session starts ==============================
platform darwin -- Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /path/to/your/project
collected 1 item
test_main.py .
============================== 1 passed in 0.01s ===============================
Δοκιμή Διαφορετικών Μεθόδων HTTP
Το TestClient υποστηρίζει όλες τις τυπικές μεθόδους HTTP, συμπεριλαμβανομένων των GET, POST, PUT, DELETE και PATCH. Ας δούμε πώς να δοκιμάσουμε καθεμία από αυτές τις μεθόδους.
Δοκιμή Αιτημάτων GET
Έχουμε ήδη δει ένα παράδειγμα δοκιμής ενός αιτήματος GET στην προηγούμενη ενότητα. Ακολουθεί ένα άλλο παράδειγμα, δοκιμάζοντας το τελικό σημείο /items/{item_id}:
def test_read_item():
response = client.get("/items/1?q=test")
assert response.status_code == 200
assert response.json() == {"item_id": 1, "q": "test"}
Αυτή η δοκιμή στέλνει ένα αίτημα GET στο /items/1 με μια παράμετρο ερωτήματος q=test. Στη συνέχεια, δηλώνει ότι ο κωδικός κατάστασης απόκρισης είναι 200 και ότι το JSON απόκρισης περιέχει τα αναμενόμενα δεδομένα.
Δοκιμή Αιτημάτων POST
Για να δοκιμάσετε ένα αίτημα POST, πρέπει να στείλετε δεδομένα στο σώμα του αιτήματος. Το TestClient σειριοποιεί αυτόματα τα δεδομένα σε JSON.
def test_create_item():
item_data = {"name": "Example Item", "description": "A test item", "price": 9.99, "tax": 1.00}
response = client.post("/items/", json=item_data)
assert response.status_code == 200
assert response.json() == item_data
Σε αυτή τη δοκιμή:
- Δημιουργούμε ένα λεξικό
item_dataπου περιέχει τα δεδομένα για το νέο στοιχείο. - Χρησιμοποιούμε το
client.post("/items/", json=item_data)για να στείλουμε ένα αίτημα POST στο τελικό σημείο/items/, μεταβιβάζοντας τοitem_dataως το ωφέλιμο φορτίο JSON. - Δηλώνουμε ότι ο κωδικός κατάστασης απόκρισης είναι 200 και ότι το JSON απόκρισης ταιριάζει με το
item_data.
Δοκιμή Αιτημάτων PUT, DELETE και PATCH
Η δοκιμή αιτημάτων PUT, DELETE και PATCH είναι παρόμοια με τη δοκιμή αιτημάτων POST. Απλώς χρησιμοποιείτε τις αντίστοιχες μεθόδους στο TestClient:
def test_update_item():
item_data = {"name": "Updated Item", "description": "An updated test item", "price": 19.99, "tax": 2.00}
response = client.put("/items/1", json=item_data)
assert response.status_code == 200
# Add assertions for the expected response
def test_delete_item():
response = client.delete("/items/1")
assert response.status_code == 200
# Add assertions for the expected response
def test_patch_item():
item_data = {"price": 29.99}
response = client.patch("/items/1", json=item_data)
assert response.status_code == 200
# Add assertions for the expected response
Θυμηθείτε να προσθέσετε assertions για να επαληθεύσετε ότι οι αποκρίσεις είναι όπως αναμένεται.
Προηγμένες Τεχνικές Δοκιμών
Το TestClient προσφέρει πολλές προηγμένες λειτουργίες που μπορούν να σας βοηθήσουν να γράψετε πιο ολοκληρωμένες και αποτελεσματικές δοκιμές.
Δοκιμή με Εξαρτήσεις
Το σύστημα dependency injection του FastAPI σας επιτρέπει να εισάγετε εύκολα εξαρτήσεις στα τελικά σημεία του API σας. Κατά τη δοκιμή, μπορεί να θέλετε να αντικαταστήσετε αυτές τις εξαρτήσεις για να παρέχετε mock ή test-specific υλοποιήσεις.
Για παράδειγμα, υποθέστε ότι η εφαρμογή σας εξαρτάται από μια σύνδεση βάσης δεδομένων. Μπορείτε να αντικαταστήσετε την εξάρτηση της βάσης δεδομένων στις δοκιμές σας για να χρησιμοποιήσετε μια βάση δεδομένων στη μνήμη:
from typing import Annotated
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base, Session
# Database Configuration
DATABASE_URL = "sqlite:///./test.db" # In-memory database for testing
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# Define User Model
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, index=True)
password = Column(String)
Base.metadata.create_all(bind=engine)
# FastAPI App
app = FastAPI()
# Dependency to get the database session
def get_db():
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
# Endpoint to create a user
@app.post("/users/")
async def create_user(username: str, password: str, db: Session = Depends(get_db)):
db_user = User(username=username, password=password)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
from fastapi.testclient import TestClient
from .main import app, get_db, Base, engine, TestingSessionLocal
client = TestClient(app)
# Override the database dependency for testing
def override_get_db():
try:
db = TestingSessionLocal()
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
def test_create_user():
# First, ensure the tables are created, which may not happen by default
Base.metadata.create_all(bind=engine) # important: create the tables in the test db
response = client.post("/users/", params={"username": "testuser", "password": "password123"})
assert response.status_code == 200
assert response.json()["username"] == "testuser"
# Clean up the override after the test if needed
app.dependency_overrides = {}
Αυτό το παράδειγμα αντικαθιστά την εξάρτηση get_db με μια test-specific συνάρτηση που επιστρέφει μια session σε μια βάση δεδομένων SQLite στη μνήμη. Σημαντικό: Η δημιουργία metadata πρέπει να κληθεί ρητά για να λειτουργήσει σωστά η δοκιμαστική db. Η αποτυχία δημιουργίας του πίνακα θα οδηγήσει σε σφάλματα που σχετίζονται με πίνακες που λείπουν.
Δοκιμή Ασύγχρονου Κώδικα
Το FastAPI έχει δημιουργηθεί για να είναι ασύγχρονο, επομένως συχνά θα χρειαστεί να δοκιμάσετε ασύγχρονο κώδικα. Το TestClient υποστηρίζει απρόσκοπτα τις ασύγχρονες δοκιμές.
Για να δοκιμάσετε ένα ασύγχρονο τελικό σημείο, απλώς ορίστε τη συνάρτηση δοκιμής σας ως async:
import asyncio
from fastapi import FastAPI
app = FastAPI()
@app.get("/async")
async def async_endpoint():
await asyncio.sleep(0.1) # Simulate some async operation
return {"message": "Async Hello"}
import pytest
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
@pytest.mark.asyncio # Needed to be compatible with pytest-asyncio
async def test_async_endpoint():
response = client.get("/async")
assert response.status_code == 200
assert response.json() == {"message": "Async Hello"}
Σημείωση: Πρέπει να εγκαταστήσετε το pytest-asyncio για να χρησιμοποιήσετε το @pytest.mark.asyncio: pip install pytest-asyncio. Πρέπει επίσης να βεβαιωθείτε ότι το asyncio.get_event_loop() έχει ρυθμιστεί εάν χρησιμοποιείτε παλαιότερες εκδόσεις pytest. Εάν χρησιμοποιείτε την έκδοση pytest 8 ή νεότερη, αυτό μπορεί να μην απαιτείται.
Δοκιμή Αποστολών Αρχείων
Το FastAPI διευκολύνει το χειρισμό των αποστολών αρχείων. Για να δοκιμάσετε τις αποστολές αρχείων, μπορείτε να χρησιμοποιήσετε την παράμετρο files των μεθόδων αιτήματος του TestClient.
from fastapi import FastAPI, File, UploadFile
from typing import List
app = FastAPI()
@app.post("/files/")
async def create_files(files: List[bytes] = File()):
return {"file_sizes": [len(file) for file in files]}
@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile]):
return {"filenames": [file.filename for file in files]}
from fastapi.testclient import TestClient
from .main import app
import io
client = TestClient(app)
def test_create_files():
file_content = b"Test file content"
files = [('files', ('test.txt', io.BytesIO(file_content), 'text/plain'))]
response = client.post("/files/", files=files)
assert response.status_code == 200
assert response.json() == {"file_sizes": [len(file_content)]}
def test_create_upload_files():
file_content = b"Test upload file content"
files = [('files', ('test_upload.txt', io.BytesIO(file_content), 'text/plain'))]
response = client.post("/uploadfiles/", files=files)
assert response.status_code == 200
assert response.json() == {"filenames": ["test_upload.txt"]}
Σε αυτή τη δοκιμή, δημιουργούμε ένα dummy αρχείο χρησιμοποιώντας το io.BytesIO και το μεταβιβάζουμε στην παράμετρο files. Η παράμετρος files δέχεται μια λίστα από tuples, όπου κάθε tuple περιέχει το όνομα πεδίου, το όνομα αρχείου και το περιεχόμενο αρχείου. Ο τύπος περιεχομένου είναι σημαντικός για την ακριβή διαχείριση από τον διακομιστή.
Δοκιμή Χειρισμού Σφαλμάτων
Είναι σημαντικό να δοκιμάσετε πώς το API σας χειρίζεται τα σφάλματα. Μπορείτε να χρησιμοποιήσετε το TestClient για να στείλετε μη έγκυρα αιτήματα και να επαληθεύσετε ότι το API επιστρέφει τις σωστές αποκρίσεις σφαλμάτων.
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id > 100:
raise HTTPException(status_code=400, detail="Item ID too large")
return {"item_id": item_id}
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_item_error():
response = client.get("/items/101")
assert response.status_code == 400
assert response.json() == {"detail": "Item ID too large"}
Αυτή η δοκιμή στέλνει ένα αίτημα GET στο /items/101, το οποίο προκαλεί ένα HTTPException με κωδικό κατάστασης 400. Η δοκιμή δηλώνει ότι ο κωδικός κατάστασης απόκρισης είναι 400 και ότι το JSON απόκρισης περιέχει το αναμενόμενο μήνυμα σφάλματος.
Δοκιμή Λειτουργιών Ασφαλείας
Εάν το API σας χρησιμοποιεί authentication ή authorization, θα πρέπει να δοκιμάσετε και αυτές τις λειτουργίες ασφαλείας. Το TestClient σας επιτρέπει να ορίσετε κεφαλίδες και cookies για να προσομοιώσετε αιτήματα με authentication.
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
app = FastAPI()
# Security
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# Simulate authentication
if form_data.username != "testuser" or form_data.password != "password123":
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password")
return {"access_token": "fake_token", "token_type": "bearer"}
@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):
return {"message": "Protected data"}
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_login():
response = client.post("/token", data={"username": "testuser", "password": "password123"})
assert response.status_code == 200
assert "access_token" in response.json()
def test_protected_route():
# First, get a token
token_response = client.post("/token", data={"username": "testuser", "password": "password123"})
token = token_response.json()["access_token"]
# Then, use the token to access the protected route
response = client.get("/protected", headers={"Authorization": f"Bearer {token}"}) # corrected format.
assert response.status_code == 200
assert response.json() == {"message": "Protected data"}
Σε αυτό το παράδειγμα, δοκιμάζουμε το τελικό σημείο σύνδεσης και, στη συνέχεια, χρησιμοποιούμε το полученный token για να αποκτήσουμε πρόσβαση σε μια προστατευμένη διαδρομή. Η παράμετρος headers των μεθόδων αιτήματος του TestClient σάς επιτρέπει να ορίζετε προσαρμοσμένες κεφαλίδες, συμπεριλαμβανομένης της κεφαλίδας Authorization για bearer tokens.
Βέλτιστες Πρακτικές για Δοκιμές FastAPI
Ακολουθούν ορισμένες βέλτιστες πρακτικές που πρέπει να ακολουθήσετε κατά τη δοκιμή των εφαρμογών σας FastAPI:
- Γράψτε ολοκληρωμένες δοκιμές: Στοχεύστε σε υψηλή κάλυψη δοκιμών για να διασφαλίσετε ότι όλα τα μέρη του API σας έχουν δοκιμαστεί διεξοδικά.
- Χρησιμοποιήστε περιγραφικά ονόματα δοκιμών: Βεβαιωθείτε ότι τα ονόματα των δοκιμών σας υποδεικνύουν σαφώς τι επαληθεύει η δοκιμή.
- Ακολουθήστε το μοτίβο Arrange-Act-Assert: Οργανώστε τις δοκιμές σας σε τρεις διακριτές φάσεις: Arrange (ρύθμιση των δεδομένων δοκιμής), Act (εκτέλεση της ενέργειας που δοκιμάζεται) και Assert (επαλήθευση των αποτελεσμάτων).
- Χρησιμοποιήστε mock objects: Κάντε mock τις εξωτερικές εξαρτήσεις για να απομονώσετε τις δοκιμές σας και να αποφύγετε να βασίζεστε σε εξωτερικά συστήματα.
- Δοκιμάστε edge cases: Δοκιμάστε το API σας με μη έγκυρη ή απροσδόκητη είσοδο για να διασφαλίσετε ότι χειρίζεται τα σφάλματα με χάρη.
- Εκτελέστε δοκιμές συχνά: Ενσωματώστε τις δοκιμές στη ροή εργασιών ανάπτυξης για να εντοπίσετε σφάλματα έγκαιρα και συχνά.
- Ενσωματώστε με CI/CD: Αυτοματοποιήστε τις δοκιμές σας στην CI/CD pipeline για να διασφαλίσετε ότι όλες οι αλλαγές κώδικα έχουν δοκιμαστεί διεξοδικά πριν από την ανάπτυξη στην παραγωγή. Εργαλεία όπως το Jenkins, το GitLab CI, το GitHub Actions ή το CircleCI μπορούν να χρησιμοποιηθούν για την επίτευξη αυτού.
Παράδειγμα: Δοκιμή Διεθνοποίησης (i18n)
Κατά την ανάπτυξη API για ένα παγκόσμιο κοινό, η διεθνοποίηση (i18n) είναι απαραίτητη. Η δοκιμή i18n περιλαμβάνει την επαλήθευση ότι το API σας υποστηρίζει σωστά πολλές γλώσσες και περιοχές. Ακολουθεί ένα παράδειγμα για το πώς μπορείτε να δοκιμάσετε το i18n σε μια εφαρμογή FastAPI:
from fastapi import FastAPI, Header
from typing import Optional
app = FastAPI()
messages = {
"en": {"greeting": "Hello, world!"},
"fr": {"greeting": "Bonjour le monde !"},
"es": {"greeting": "¡Hola Mundo!"},
}
@app.get("/")
async def read_root(accept_language: Optional[str] = Header(None)):
lang = accept_language[:2] if accept_language else "en"
if lang not in messages:
lang = "en"
return {"message": messages[lang]["greeting"]}
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_root_en():
response = client.get("/", headers={"Accept-Language": "en-US"})
assert response.status_code == 200
assert response.json() == {"message": "Hello, world!"}
def test_read_root_fr():
response = client.get("/", headers={"Accept-Language": "fr-FR"})
assert response.status_code == 200
assert response.json() == {"message": "Bonjour le monde !"}
def test_read_root_es():
response = client.get("/", headers={"Accept-Language": "es-ES"})
assert response.status_code == 200
assert response.json() == {"message": "¡Hola Mundo!"}
def test_read_root_default():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, world!"}
Αυτό το παράδειγμα ορίζει την κεφαλίδα Accept-Language για να καθορίσει την επιθυμητή γλώσσα. Το API επιστρέφει τον χαιρετισμό στην καθορισμένη γλώσσα. Η δοκιμή διασφαλίζει ότι το API χειρίζεται σωστά διαφορετικές γλωσσικές προτιμήσεις. Εάν η κεφαλίδα Accept-Language απουσιάζει, χρησιμοποιείται η προεπιλεγμένη γλώσσα "en".
Συμπέρασμα
Η δοκιμή είναι ένα ουσιαστικό μέρος της δημιουργίας ισχυρών και αξιόπιστων εφαρμογών FastAPI. Το TestClient παρέχει έναν απλό και βολικό τρόπο για να δοκιμάσετε τα τελικά σημεία του API σας. Ακολουθώντας τις βέλτιστες πρακτικές που περιγράφονται σε αυτόν τον οδηγό, μπορείτε να γράψετε ολοκληρωμένες δοκιμές που διασφαλίζουν την ποιότητα και τη σταθερότητα των API σας. Από βασικά αιτήματα έως προηγμένες τεχνικές, όπως dependency injection και ασύγχρονες δοκιμές, το TestClient σάς δίνει τη δυνατότητα να δημιουργήσετε καλά δοκιμασμένο και συντηρήσιμο κώδικα. Αγκαλιάστε τις δοκιμές ως βασικό μέρος της ροής εργασιών ανάπτυξης και θα δημιουργήσετε API που είναι τόσο ισχυρά όσο και αξιόπιστα για τους χρήστες σε όλο τον κόσμο. Θυμηθείτε τη σημασία της ενσωμάτωσης CI/CD για την αυτοματοποίηση των δοκιμών και τη διασφάλιση της συνεχούς διασφάλισης ποιότητας.